package com.ruoyi.ltd_web.service.impl;

import java.util.List;

import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.ltd_web.mapper.LtdProductMapper;
import com.ruoyi.ltd_web.domain.LtdProduct;
import com.ruoyi.ltd_web.service.ILtdProductService;

/**
 * 公司产品Service业务层处理
 *
 * @author ruoyi
 * @date 2025-03-17
 */
@Service
public class LtdProductServiceImpl implements ILtdProductService
{
    @Autowired
    private LtdProductMapper ltdProductMapper;

    /**
     * 查询公司产品
     *
     * @param productId 公司产品主键
     * @return 公司产品
     */
    @Override
    public LtdProduct selectLtdProductByProductId(Long productId)
    {
        return ltdProductMapper.selectLtdProductByProductId(productId);
    }

    /**
     * 查询公司产品列表
     *
     * @param ltdProduct 公司产品
     * @return 公司产品
     */
    @Override
    public List<LtdProduct> selectLtdProductList(LtdProduct ltdProduct)
    {
        return ltdProductMapper.selectLtdProductList(ltdProduct);
    }

    /**
     * 新增公司产品
     *
     * @param ltdProduct 公司产品
     * @return 结果
     */
    @Override
    public int insertLtdProduct(LtdProduct ltdProduct)
    {
        ltdProduct.setCreateTime(DateUtils.getNowDate());
        return ltdProductMapper.insertLtdProduct(ltdProduct);
    }

    /**
     * 修改公司产品
     *
     * @param ltdProduct 公司产品
     * @return 结果
     */
    @Override
    public int updateLtdProduct(LtdProduct ltdProduct)
    {
        ltdProduct.setUpdateTime(DateUtils.getNowDate());
        return ltdProductMapper.updateLtdProduct(ltdProduct);
    }

    /**
     * 批量删除公司产品
     *
     * @param productIds 需要删除的公司产品主键
     * @return 结果
     */
    @Override
    public int deleteLtdProductByProductIds(Long[] productIds)
    {
        return ltdProductMapper.deleteLtdProductByProductIds(productIds);
    }

    /**
     * 删除公司产品信息
     *
     * @param productId 公司产品主键
     * @return 结果
     */
    @Override
    public int deleteLtdProductByProductId(Long productId)
    {
        return ltdProductMapper.deleteLtdProductByProductId(productId);
    }

    @Override
    public boolean checkProductNameUnique(LtdProduct ltdProduct) {
        Long productId = StringUtils.isNull(ltdProduct.getProductId()) ? -1L : ltdProduct.getProductId();
        LtdProduct info = ltdProductMapper.checkProductNameUnique(ltdProduct.getProductName(), ltdProduct.getProductId());
        if (StringUtils.isNotNull(info) && info.getProductId().longValue() != productId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 新增保存产品信息
     */
    @Override
    public AjaxResult addLtdProduct(LtdProduct ltdProduct) {
        LtdProduct info = ltdProductMapper.selectLtdProductByProductId(ltdProduct.getParentId());
        // 如果父节点不为正常状态,则不允许新增子节点
        if (!UserConstants.DEPT_NORMAL.equals(info.getStatus().toString()))
        {
            throw new ServiceException("已停用，不允许新增");
        }
        ltdProduct.setAncestors(info.getAncestors() + "," + ltdProduct.getParentId());
        ltdProduct.setCreateTime(DateUtils.getNowDate());
        return AjaxResult.success(ltdProductMapper.insertLtdProduct(ltdProduct));
    }

    /**
     * 修改保存产品信息
     */
    @Override
    public AjaxResult updateProduct(LtdProduct ltdProduct) {
        LtdProduct newProduct = ltdProductMapper.selectLtdProductByProductId(ltdProduct.getParentId());
        LtdProduct oldProduct = ltdProductMapper.selectLtdProductByProductId(ltdProduct.getProductId());


        if (StringUtils.isNotNull(newProduct) && StringUtils.isNotNull(oldProduct))
        {
            String newAncestors = newProduct.getAncestors() + "," + newProduct.getProductId();
            String oldAncestors = oldProduct.getAncestors();
            ltdProduct.setAncestors(newAncestors);
            updateProductChildren(ltdProduct.getProductId(), newAncestors, oldAncestors);
        }
        int result = ltdProductMapper.updateLtdProduct(ltdProduct);
        if (UserConstants.DEPT_NORMAL.equals(ltdProduct.getStatus().toString()) && StringUtils.isNotEmpty(ltdProduct.getAncestors())
                && !StringUtils.equals("0", ltdProduct.getAncestors()))
        {
            // 如果该部门是启用状态，则启用该部门的所有上级部门
            updateParentProductStatusNormal(ltdProduct);
        }
        return AjaxResult.success(result);

    }

    /**
     * 修改该项的父级状态
     */
    private void updateParentProductStatusNormal(LtdProduct ltdProduct)
    {
        String ancestors = ltdProduct.getAncestors();
        Long[] productIds = Convert.toLongArray(ancestors);
        ltdProductMapper.updateProductStatusNormal(productIds);
    }

    /**
     * 修改子元素关系
     *
     * @param productId 被修改的ID
     * @param newAncestors 新的父ID集合
     * @param oldAncestors 旧的父ID集合
     */
    public void updateProductChildren(Long productId, String newAncestors, String oldAncestors)
    {
        List<LtdProduct> children = ltdProductMapper.selectLtdProductById(productId);
        for (LtdProduct child : children)
        {
            child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
        }
        if (children.size() > 0)
        {
            ltdProductMapper.updateProductChildren(children);
        }
    }

    @Override
    public int selectNormalChildrenProductById(Long productId) {
        return ltdProductMapper.selectNormalChildrenProductById(productId);
    }

    @Override
    public boolean hasChildByProductId(Long productId) {
        int result = ltdProductMapper.hasChildByProductId(productId);
        return result > 0;

    }

    @Override
    public AjaxResult deleteProductById(Long productId) {
        return AjaxResult.success(ltdProductMapper.deleteProductById(productId));
    }


}
